package com.atguigu.tingshu.album.task;

import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Set;

/**
 * @Author GQS @Date 2024/11/6/0:39 @Description
 * 专辑可靠性投递同步数据失败的定时任务: 兜底方案
 */
@Component
public class AlbumMessageFailTask {

  @Autowired
  private RedisTemplate redisTemplate;

  @Autowired
  private RabbitTemplate rabbitTemplate;

  @Autowired
  private AlbumInfoService albumInfoService;

  /**
   * 定时检查同步失败的专辑数据: 每30分钟检查一次同步失败过的专辑数据,将专辑最终状态告诉es
   * cron: 秒 分 时 日 月 周
   *  *: 任意时间
   *  ,分隔: 指定时间
   *  -分隔: 区间
   *  /分隔: 间隔
   *  fixedDelay(毫秒): 多久执行一次,上一次执行完后开始倒计时
   *  fixedRate(毫秒): 多久执行一次,上一次指定开始后开始倒计时
   *  initialDelay(毫秒): 影响第一次,项目启动完成后多久执行第一次
   *
   */

  // @Scheduled(cron = "0 0/30 * * * ?")
  @XxlJob("albumMessageFailTask")
  //    @Scheduled(fixedDelay = 30000, initialDelay = 1000)
  public void albumMessageFailTask(){
    //从redis中获取所有失败的专辑的id信息
    Set<String> albumIdSet =
            redisTemplate.opsForSet().members("album_upper_or_down");
    //遍历处理
    albumIdSet.stream().forEach(albumId->{
      try {
        //查询专辑的数据
        AlbumInfo albumInfo = albumInfoService.getById(albumId);
        //判断专辑是否为公开
        CorrelationData correlationData = new CorrelationData();
        if(albumInfo.getIsOpen().equals("1")){
          correlationData.setReturned(new ReturnedMessage(
                  new Message(albumId.toString().getBytes()),
                  -1,
                  null,
                  null,
                  "album.es.upper"));
          //上架: es写数据
          rabbitTemplate.convertAndSend("album_info_exchange",
                                        "album.es.upper",
                                        albumId + "",
                                        correlationData);
        }else{
          correlationData.setReturned(new ReturnedMessage(
                  new Message(albumId.toString().getBytes()),
                  -1,
                  null,
                  null,
                  "album.es.down"));
          //下架: es删除数据
          rabbitTemplate.convertAndSend("album_info_exchange",
                                        "album.es.down",
                                        albumId + "",
                                        correlationData);
        }
        //删除这个id
        redisTemplate.opsForSet().remove("album_upper_or_down", albumId);
      }catch (Exception e){
        e.printStackTrace();
      }
    });
  }
}
